package com.develop.wechatpay.domain;

import lombok.Data;
import lombok.NonNull;

import javax.validation.Valid;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

@Data
public class WechatPayModel {
    @Data
    public class CommReqAmountInfo {
        @Min(value = 1, message = "金额必须大于或等于1分")
        public int total;//必填 总金额 订单总金额，单位为分
        public String currency = "CNY";//选填 货币类型 CNY：人民币，境内商户号仅支持人民币

    }

    @Data
    public class JsapiReqPayerInfo {
        @NotBlank(message = "微信用户ID为空!")
        public String openid;//用户在普通商户AppID下的唯一标识。 下单前需获取到用户的OpenID
    }

    @Data
    public class GoodsDetail {
        public String merchant_goods_id;//必填 【商户侧商品编码】 由半角的大小写字母、数字、中划线、下划线中的一种或几种组成。
        public String wechatpay_goods_id;//选填【微信支付商品编码】 微信支付定义的统一商品编号（没有可不传）
        public String goods_name;//选填【商品名称】 商品的实际名称
        public int quantity;//必填【商品数量】 用户购买的数量
        public int unit_price;//必填【商品单价】 单位为：分。如果商户有优惠，需传输商户优惠后的单价(例如：用户对一笔100元的订单使用了商场发的纸质优惠券100-50，则活动商品的单价应为原单价-50)
    }

    @Data
    public class StoreInfo {
        public String id;//必填  【门店编号】 商户侧门店编号
        public String name;//选填 【门店名称】 商户侧门店名称
        public String area_code;//选填 【地区编码】 地区编码，详细请见省市区编号对照表。
        public String address;//选填【详细地址】 详细的商户门店地址
    }

    @Data
    public class CommReqSceneInfo {
        public String payer_client_ip;//必填 【用户终端IP】 用户的客户端IP，支持IPv4和IPv6两种格式的IP地址。
        public String device_id;//选填【商户端设备号】 商户端设备号（门店号或收银设备ID）
        public StoreInfo store_info;//选填 【商户门店信息】 商户门店信息

    }

    @Data
    public class OrderDetail {
        public int cost_price;//选填 订单原价 1、商户侧一张小票订单可能被分多次支付，订单原价用于记录整张小票的交易金额。
        //2、当订单原价与支付金额不相等，则不享受优惠。
        //3、该字段主要用于防止同一张小票分多次支付，以享受多次优惠的情况，正常支付订单不必上传此参数。
        public String invoice_id;//选填 商品小票ID
        public List<GoodsDetail> goods_detail;//必填 单品列表信息 条目个数限制：【1，6000】
    }

    @Data
    public class SettleInfo {
        public Boolean profit_sharing;//选填 【是否指定分账】 是否指定分账
    }

    public String appid;//必填 公众号ID
    public String mchid;//必填 直连商户号

    @NotBlank(message = "商品描述必填")
    public String description;//必填 商品描述
    @NotBlank(message = "商户系统内部订单号必填")
    public String out_trade_no;//必填 商户系统内部订单号，只能是数字、大小写字母_-*且在同一个商户号下唯一
    public String time_expire;//选填 订单失效时间 遵循rfc3339标准格式，格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE，yyyy-MM-DD表示年月日，
    //T出现在字符串中，表示time元素的开头，HH:mm:ss表示时分秒，
    //TIMEZONE表示时区（+08:00表示东八区时间，领先UTC8小时，即北京时间）。
    //例如：2015-05-20T13:29:35+08:00表示，北京时间2015年5月20日13点29分35秒。
    public String attach;//选填 附加数据，在查询API和支付通知中原样返回，可作为自定义参数使用，实际情况下只有支付完成状态才会返回该字段。
    public String notify_url;//必填 通知地址 异步接收微信支付结果通知的回调地址，通知URL必须为外网可访问的URL，不能携带参数。 公网域名必须为HTTPS，如果是走专线接入，使用专线NAT IP或者私有回调域名可使用HTTP
    public String goods_tag; //选填 订单优惠标记
    public Boolean support_fapiao;//电子发票入口开放标识  传入true时，支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能，传此字段才可生效。
    @Valid
    @NotNull(message = "订单金额信息必填")
    public CommReqAmountInfo amount;//必填 订单金额 订单金额信息
    @Valid
    @NotNull(message = "支付者信息必填")
    public JsapiReqPayerInfo payer;//必填 【支付者】 支付者信息。
    public OrderDetail detail;//选填  【优惠功能】 优惠功能
    public CommReqSceneInfo scene_info;//选填 【场景信息】 支付场景描述
    public SettleInfo settle_info;//选填【结算信息】 结算信息

}
